﻿

CREATE PROCEDURE [dbo].[resuma_CalculCAS] 
	@Anul smallint,
	@Luna smallint,
	@CodUnitate smallint,
	@IDPersoanaSelectata int
AS

DECLARE @MesajEroare varchar(500)

-----pozitii pe angajat si pozitie salarizare
	INSERT INTO [AngajatiRetineri]
     ([IDPersoana],[valoare],[IDTipRetinere],[Anul],[Luna])      
     SELECT Ps.IDPersoana,0, TSp.IDTipRetinere,@Anul,@Luna
     FROM
     [Persoane] Ps
     JOIN [AngajatiSalarizare] AnS ON Ps.IdPersoana = Ans.IdPersoana
     JOIN [TipRetinere] TSp ON TSp.Nume IN ('CAS')
     WHERE 
        (AnS.PanaLaData IS NULL OR @Anul*100+@Luna<=YEAR(Ans.PanaLaData)*100+MONTH(Ans.PanaLaData))
		AND (Ps.DataPlecarii IS NULL OR @Anul*100+@Luna<=YEAR(Ps.DataPlecarii)*100+MONTH(Ps.DataPlecarii))
		AND (Ps.CodUnitate=@CodUnitate) AND Ans.NormaBaza=1 AND Ps.PlatesteCAS = 1
		AND(@IDPersoanaSelectata=-1 OR Ps.IDPersoana = @IDPersoanaSelectata) AND 
		NOT EXISTS(Select * FROM [AngajatiRetineri] APS 
				   WHERE [IDPersoana]= Ps.IdPersoana AND TSp.IDTipRetinere = IDTipRetinere)
	   GROUP BY  Ps.IDPersoana,Ans.IDAngajatSalarizare,TSp.IDTipRetinere 

	IF @@ERROR<>0
	BEGIN
		set @MesajEroare = 'Eroare la completare Retinere CAS'
		GOTO EROARE2				   
	END	

				 
--sterge pozitiile eliminate

DELETE FROM [AngajatiRetineri] WHERE IDTipRetinere in (SELECT IDTipRetinere FROM [TipRetinere] WHERE Nume IN ('CAS')) AND
	NOT EXISTS(SELECT * FROM
     [Persoane] Ps
     JOIN [AngajatiSalarizare] AnS ON Ps.IdPersoana = Ans.IdPersoana
     WHERE 
        (AnS.PanaLaData IS NULL OR @Anul*100+@Luna<=YEAR(Ans.PanaLaData)*100+MONTH(Ans.PanaLaData))
		AND (Ps.DataPlecarii IS NULL OR @Anul*100+@Luna<=YEAR(Ps.DataPlecarii)*100+MONTH(Ps.DataPlecarii))
		AND (Ps.CodUnitate=@CodUnitate) AND Ps.PlatesteCAS=1
		AND(@IDPersoanaSelectata=-1 OR Ps.IDPersoana = @IDPersoanaSelectata) AND
		[AngajatiRetineri].[IDPersoana]= Ps.IdPersoana )


	IF @@ERROR<>0
	BEGIN
		set @MesajEroare = 'Eroare la stergere inexistente retinere CAS'
		GOTO EROARE2				   
	END	

DECLARE @ProcentCAS decimal(18,12)
DECLARE @ZileLucratore decimal(15,2)
DECLARE @SalarMinim decimal(18,2)
DECLARE @SalarMediuBrut decimal(18,2)
DECLARE @NrSalCAS decimal(18,2)
DECLARE @CASMAX decimal(18,2)
DECLARE @PlafonareCAS bit


SELECT @ProcentCAS = ProcentCASAngajat,@SalarMinim = SalarMinim,@SalarMediuBrut=SalarMediubrut,
   @NrSalCAS = NrSalariiMaxCAS,@PlafonareCAS=PlafonareCAS  FROM ResUmaSetup WHERE [CodUnitate]=@CodUnitate
IF @@ERROR<>0
	BEGIN
		set @MesajEroare = 'Eroare la setup'
		GOTO EROARE2				   
	END	   
SELECT @ZileLucratore=ZileLucratoare FROM resuma_SetariLuna WHERE [Luna]=@Luna AND [Anul]=@Anul
IF @@ERROR<>0
	BEGIN
		set @MesajEroare = 'Eroare la setup'
		GOTO EROARE2				   
	END	   

SET @CASMAX = ROUND(@NrSalCAS*@SalarMediuBrut*@ProcentCAS/100,0)
PRINT(@CASMAX)
UPDATE [AngajatiRetineri] SET 
	[Valoare] = 
	---brutul total de pe departamentul cu norma de baza
	  ROUND(((SELECT SUM(Suma) FROM [AngajatiStatPlata] ASt JOIN [TipStatPlata] tsp ON Ast.IDTipStatPlata=tsp.IDTipStatPlata
	    WHERE [AngajatiRetineri].IDPersoana=Ast.IDPersoana AND
		[AngajatiRetineri].Luna = ASt.Luna
		AND [AngajatiRetineri].Anul = ASt.Anul AND Cod IN ('BRT'))
	--zilele boala de pe toate depatamentele
	  +(SELECT COALESCE(SUM(ZileBoala),0) FROM [AngajatiBoli] AnB WHERE [AngajatiRetineri].IDPersoana=AnB.IDPersoana AND
		 [AngajatiRetineri].Luna = AnB.Luna AND [AngajatiRetineri].Anul = AnB.Anul)*@SalarMinim/@ZileLucratore
	 --elimina pontajul pentru care nu se plateste CAS
	  -	 (SELECT COALESCE(SUM(Valoare*SalarUnitar),0) FROM [AngajatiPontaj] AnP JOIN [TipPrezenta] tp ON AnP.IdTipPrezenta = tp.IdTipPrezenta
	     WHERE [AngajatiRetineri].IDPersoana=AnP.IDPersoana AND tp.InclusCAS=0 AND
		 [AngajatiRetineri].Luna = AnP.Luna AND [AngajatiRetineri].Anul = AnP.Anul)
		--ELIMINA SPORURILE PENTRU CARE NU SE PLATESTE cas 
	   -(SELECT COALESCE(SUM(AnP.Valoare),0) FROM CalculSporuri AnP JOIN [TipSPOR] tp ON AnP.IdTipSpor = tp.IdTipSpor
	     WHERE [AngajatiRetineri].IDPersoana=AnP.IDPersoana AND tp.InclusCAS=0 AND
		 [AngajatiRetineri].Luna = AnP.Luna AND [AngajatiRetineri].Anul = AnP.Anul)
		--ELIMINA ADAOSURILE CARE NU SUNT INCLUSE IN cas
		-(SELECT COALESCE(SUM(AnP.Suma),0) FROM AngajatiADAOSURI AnP JOIN [TipAdaos] tp ON AnP.IdTipAdaos = tp.IdTipAdaos
	     WHERE [AngajatiRetineri].IDPersoana=AnP.IDPersoana AND tp.InclusCAS=0 AND
		 [AngajatiRetineri].Luna = AnP.Luna AND [AngajatiRetineri].Anul = AnP.Anul))* (@ProcentCAS/100)  ,0)
	
	FROM TipRetinere tsp 
	WHERE  Luna = @Luna AND Anul=@Anul AND tsp.NUME IN ('CAS') AND [AngajatiRetineri].IDTipRetinere = tsp.IDTipRetinere		

IF @@ERROR<>0
	BEGIN
		set @MesajEroare = 'Eroare la completare CAS'
		GOTO EROARE2				   
	END	
	
IF @PlafonareCAS=1 AND @CASMAX>0
UPDATE [AngajatiRetineri] SET 
	[Valoare] = @CASMAX
FROM TipRetinere tsp		
	WHERE  Luna = @Luna AND Anul=@Anul AND [AngajatiRetineri].IDTipRetinere = tsp.IDTipRetinere
	AND tsp.NUME IN ('CAS') AND [Valoare]>@CASMAX

IF @@ERROR<>0
	BEGIN
		set @MesajEroare = 'Eroare la limitare CAS'
		GOTO EROARE2				   
	END	

GOTO Gata
EROARE:
	RAISERROR ('Eroare la recalcularea salariilor!',16,-1)
	GOTO Gata
EROARE1:
	RAISERROR ('!!',16,-1)	
	GOTO Gata
EROARE2:
	RAISERROR (@MesajEroare,16,5)	
	GOTO Gata
	
Gata: